#ifndef DATABASE_H
#define DATABASE_H

#include <mysql/mysql.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

// 连接初始化函数
MYSQL* connect_init(MYSQL* conn);

// 数据库初始化函数
void Init_database(MYSQL* pconn);

//预处理有关函数
void stmt_check_safe(MYSQL_STMT* stmt , MYSQL* pconn);
//stmt到连接的映射
// 功能:传sql语句进来进行模板化
MYSQL_STMT* sql_stl(MYSQL* pconn, const char* sql, int count);
// bind作为输入参数时参数绑定
void bind_tie_in(MYSQL_BIND* bind, void* buffer, unsigned long* length, _Bool* is_null, enum enum_field_types buffer_type);
// bind作为输出参数时参数绑定
void bind_tie_out(MYSQL_BIND* bind_res, void* buffer, unsigned long buffer_length, enum enum_field_types buffer_type);
// 不使用预处理获取结果集
void show_result_ust(MYSQL* pconn);
// 使用预处理后获取结果集中的元数据及字段信息
MYSQL_RES* show_result_st(MYSQL* pconn, MYSQL_STMT* stmt);
//模板化的参数占位符绑定数据
void bind_param(MYSQL_STMT* stmt, MYSQL_BIND* bind, MYSQL* pconn);
//bind_res与结果集绑定，并打印结果集
void show_bind_res(MYSQL_STMT* stmt, MYSQL_BIND* bind_res, MYSQL* pconn, int* id_res, char* name_res, char* text_res);
//执行模板化的sql语句
void execute_sql(MYSQL_STMT* stmt, MYSQL_BIND* bind, MYSQL* pconn);
// 检查sql语句是否存在结果集
int sql_if_res(MYSQL_STMT* stmt);

//用户交互函数
//用户输入int类型
void int_in(int* value);
//用户输入字符串类型
void char_in(char* value, unsigned long* value_len);

//科室管理函数
void show_departments();
void manage_departments(MYSQL* pconn);
void add_department(MYSQL* pconn);
void view_department(MYSQL* pconn);
void update_department(MYSQL* pconn);
void delete_department(MYSQL* pconn);

// 医生管理函数
void show_doctors();
void manage_doctors(MYSQL* pconn);
void add_doctor(MYSQL* pconn);
void view_doctor(MYSQL* pconn);
void update_doctor(MYSQL* pconn);
void delete_doctor(MYSQL* pconn);

// 排班管理函数
void show_schedules();
void manage_schedules(MYSQL* pconn);
void add_schedule(MYSQL* pconn);
void view_schedule(MYSQL* pconn);
void update_schedule(MYSQL* pconn);
void delete_schedule(MYSQL* pconn);

// 门诊管理函数
void show_clinics();
void manage_clinics(MYSQL* pconn);
void add_clinic(MYSQL* pconn);
void view_clinic(MYSQL* pconn);
void update_clinic(MYSQL* pconn);
void delete_clinic(MYSQL* pconn);

// 就诊人管理函数
void show_patients();
void manage_patients(MYSQL* pconn);
void add_patient(MYSQL* pconn);
void view_patient(MYSQL* pconn);
void update_patient(MYSQL* pconn);
void delete_patient(MYSQL* pconn);

// 挂号管理函数
void manage_registrations(MYSQL* pconn);
void add_registration(MYSQL* pconn);
void view_registration(MYSQL* pconn);
void delete_registration(MYSQL* pconn);

// 排号管理函数
void manage_queue(MYSQL* pconn); 
void process_queue(MYSQL* pconn);
void list_queue(MYSQL* pconn);

#endif